/*************************************************************************
                           LIVIATcpserver  -  description
                             -------------------
    début                : 22 févr. 2012
    copyright            : (C) 2012 par maxime-chabert
*************************************************************************/

//---------- Interface de la classe <LIVIATcpserver> (fichier LIVIATcpserver.h) ------
#ifndef LIVIATCPSERVER_H_
#define LIVIATCPSERVER_H_

//--------------------------------------------------- Interfaces utilisées
#include <boost/asio.hpp>
#include <MapGrid.h>
#include <Robot.h>
#include <vector>

using namespace livia;

//------------------------------------------------------------- Constantes

//------------------------------------------------------------------ Types

//------------------------------------------------------------------------
// Rôle de la classe <LIVIATcp_server>
//
//
//------------------------------------------------------------------------
class LIVIATcp_server {
//----------------------------------------------------------------- PUBLIC

public:
//----------------------------------------------------- Méthodes publiques

void sendRobot( const Robot& robot);
//Mode d'emploi: envoie un objet robot au client

void sendGrid( std::vector<XYGrid> grid );
//Mode d'emploi: envoie les dernières modifications de la grille

void acceptation();
//Mode d'emploi: accepte la connection

void read();
//Mode d'emploi: lecture sur le canal de control

//------------------------------------------------- Surcharge d'opérateurs

//-------------------------------------------- Constructeurs - destructeur
LIVIATcp_server(boost::asio::io_service& io_service, int port, std::string address);

virtual ~LIVIATcp_server();
//------------------------------------------------------------------ PRIVE

protected:
//----------------------------------------------------- Méthodes protégées
void handle_accept(const boost::system::error_code& error);

char * robotToSend( const Robot& robot);

char *gridToSend( const std::vector<XYGrid> grid);

void connect_data( int port );
//connection du canal de données

void handler_read(const boost::system::error_code& error, std::size_t bytes_transferred);
//----------------------------------------------------- Attributs protégés

boost::asio::ip::tcp::socket control;
boost::asio::ip::tcp::socket datas;
boost::asio::ip::tcp::acceptor accept;
boost::asio::ip::tcp::endpoint address;
std::vector<char> buffer;
//--------------------------- Autres définitions dépendantes de <LIVIATcp_server>

};

#endif /* LIVIATCPSERVER_H_ */

